package com.talent.jiwen_teacher.util;

import android.app.Activity;
import android.content.Context;
import android.widget.ImageView;

import com.alibaba.sdk.android.oss.ClientException;
import com.alibaba.sdk.android.oss.ServiceException;
import com.alibaba.sdk.android.oss.model.PutObjectRequest;
import com.alibaba.sdk.android.oss.model.PutObjectResult;
import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority;
import com.bumptech.glide.request.RequestOptions;
import com.luck.picture.lib.PictureSelector;
import com.luck.picture.lib.config.PictureConfig;
import com.luck.picture.lib.config.PictureMimeType;
import com.luck.picture.lib.entity.LocalMedia;
import com.talent.jiwen_teacher.R;
import com.talent.jiwen_teacher.base.App;
import com.talent.jiwen_teacher.util.glide.GlideCircleTransform;
import com.talent.jiwen_teacher.util.glide.GlideRoundTransform;

import java.util.ArrayList;
import java.util.List;

import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;

public class ImageUtil {
    //////////////////////////////////////图片加载/////////////////////////////////////////////////

    /**图片加载
     *
     * @param context
     * @param obj
     * @param imageView
     */
    public static void loadImage(Context context, Object obj, ImageView imageView) {
        loadImageWithDefault(context, obj, R.mipmap.default_img, imageView);
    }

    public static void loadCircleImage(Context context, Object obj, ImageView imageView) {
        loadCircleImageWithDefault(context, obj, R.mipmap.default_img, imageView);
    }

    public static void loadCorner4Image(Context context, Object obj, ImageView imageView) {
        loadCornerImageWithDefault(context, obj, R.mipmap.default_img, 4, imageView);
    }

    public static void loadCircleImageWithDefault(Context context, Object obj, int defaultResId, ImageView imageView) {

        RequestOptions circleOptions = new RequestOptions()
                .centerCrop()
                .placeholder(defaultResId)
                .error(defaultResId)
                .priority(Priority.HIGH)
                .transform(new GlideCircleTransform());

        Glide.with(context)
                .load(obj)
                .apply(circleOptions)
                .into(imageView);
    }

    public static void loadCornerImageWithDefault(Context context, Object obj, int defaultResId, int corner, ImageView imageView) {

        RequestOptions circleOptions = new RequestOptions()
                .centerCrop()
                .placeholder(defaultResId)
                .error(defaultResId)
                .priority(Priority.HIGH)
                .transform(new GlideRoundTransform(context, corner));

        Glide.with(context)
                .load(obj)
                .apply(circleOptions)
                .into(imageView);
    }

    public static void loadImageWithDefault(Context context, Object obj, int defaultResId, ImageView imageView) {

        RequestOptions options = new RequestOptions()
                .centerCrop()
                .placeholder(defaultResId)
                .error(defaultResId)
                .priority(Priority.HIGH);

        Glide.with(context)
                .load(obj)
                .apply(options)
                .into(imageView);
    }

    public static void loadImageWithDefault1(Context context, Object obj, int defaultResId, ImageView imageView) {

        RequestOptions options = new RequestOptions()
                .placeholder(defaultResId)
                .error(defaultResId)
                .priority(Priority.HIGH);

        Glide.with(context)
                .load(obj)
                .apply(options)
                .into(imageView);
    }

    //////////////////////////////////////图片选择/////////////////////////////////////////////////
    /**选择图片
     例如 LocalMedia 里面返回三种path
     1.media.getPath(); 为原图path
     2.media.getCutPath();为裁剪后path，需判断media.isCut();是否为true  注意：音视频除外
     3.media.getCompressPath();为压缩后path，需判断media.isCompressed();是否为true  注意：音视频除外
     如果裁剪并压缩了，以取压缩路径为准，因为是先裁剪后压缩的
     */
    public static void pickPhoto(Activity activity, int maxImg, List<LocalMedia> selList, boolean isCrop) {
        PictureSelector.create(activity)
                .openGallery(PictureMimeType.ofImage())//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
                .theme(R.style.picture_default_style)//主题样式(不设置为默认样式) 也可参考demo values/styles下 例如：R.style.picture.white.style
                .maxSelectNum(maxImg)// 最大图片选择数量 int
                .minSelectNum(1)// 最小选择数量 int
                .imageSpanCount(4)// 每行显示个数 int
                .selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
                .previewImage(true)// 是否可预览图片 true or false
//                        .previewVideo(false)// 是否可预览视频 true or false
//                        .enablePreviewAudio(false) // 是否可播放音频 true or false
                .isCamera(true)// 是否显示拍照按钮 true or false
                .imageFormat(PictureMimeType.PNG)// 拍照保存图片格式后缀,默认jpeg
                .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
                .sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效
                .setOutputCameraPath("/CustomPath")// 自定义拍照保存路径,可不填
                .enableCrop(isCrop)// 是否裁剪 true or false
                .compress(true)// 是否压缩 true or false
//                        .glideOverride()// int glide 加载宽高，越小图片列表越流畅，但会影响列表图片浏览的清晰度
//                        .withAspectRatio()// int 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
                .hideBottomControls(false)// 是否显示uCrop工具栏，默认不显示 true or false
                .isGif(false)// 是否显示gif图片 true or false
//                        .compressSavePath(getPath())//压缩图片保存地址
                .freeStyleCropEnabled(true)// 裁剪框是否可拖拽 true or false
                .circleDimmedLayer(false)// 是否圆形裁剪 true or false
                .showCropFrame(true)// 是否显示裁剪矩形边框 圆形裁剪时建议设为false   true or false
                .showCropGrid(true)// 是否显示裁剪矩形网格 圆形裁剪时建议设为false    true or false
                .openClickSound(false)// 是否开启点击声音 true or false
                .selectionMedia(selList)// 是否传入已选图片 List<LocalMedia> list
                .previewEggs(true)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) true or false
                .cropCompressQuality(80)// 裁剪压缩质量 默认90 int
                .minimumCompressSize(100)// 小于100kb的图片不压缩
                .synOrAsy(true)//同步true或异步false 压缩 默认同步
//                        .cropWH()// 裁剪宽高比，设置如果大于图片本身宽高则无效 int
                .rotateEnabled(false) // 裁剪是否可旋转图片 true or false
                .scaleEnabled(false)// 裁剪是否可放大缩小图片 true or false
//                        .videoQuality()// 视频录制质量 0 or 1 int
//                        .videoMaxSecond(15)// 显示多少秒以内的视频or音频也可适用 int
//                        .videoMinSecond(10)// 显示多少秒以内的视频or音频也可适用 int
//                        .recordVideoSecond()//视频秒数录制 默认60s int
                .isDragFrame(true)// 是否可拖动裁剪框(固定)
                .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
    }


    /**选择视频
     例如 LocalMedia 里面返回三种path
     1.media.getPath(); 为原图path
     2.media.getCutPath();为裁剪后path，需判断media.isCut();是否为true  注意：音视频除外
     3.media.getCompressPath();为压缩后path，需判断media.isCompressed();是否为true  注意：音视频除外
     如果裁剪并压缩了，以取压缩路径为准，因为是先裁剪后压缩的
     */
    public static void pickVideo(Activity activity, int maxImg, List<LocalMedia> selList, boolean isCrop) {
        PictureSelector.create(activity)
                .openGallery(PictureMimeType.ofVideo())//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
                .theme(R.style.picture_default_style)//主题样式(不设置为默认样式) 也可参考demo values/styles下 例如：R.style.picture.white.style
                .maxSelectNum(maxImg)// 最大图片选择数量 int
                .minSelectNum(1)// 最小选择数量 int
                .imageSpanCount(4)// 每行显示个数 int
                .selectionMode(PictureConfig.SINGLE)// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
                .previewImage(false)// 是否可预览图片 true or false
                .previewVideo(false)// 是否可预览视频 true or false
                .enablePreviewAudio(false) // 是否可播放音频 true or false
                .isCamera(false)// 是否显示拍照按钮 true or false
//                .imageFormat(PictureMimeType.PNG)// 拍照保存图片格式后缀,默认jpeg
                .isZoomAnim(false)// 图片列表点击 缩放效果 默认true
                .sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效
//                .setOutputCameraPath("/CustomPath")// 自定义拍照保存路径,可不填
//                .enableCrop(isCrop)// 是否裁剪 true or false
//                .compress(true)// 是否压缩 true or false
//                        .glideOverride()// int glide 加载宽高，越小图片列表越流畅，但会影响列表图片浏览的清晰度
//                        .withAspectRatio()// int 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
//                .hideBottomControls(false)// 是否显示uCrop工具栏，默认不显示 true or false
//                .isGif(false)// 是否显示gif图片 true or false
//                        .compressSavePath(getPath())//压缩图片保存地址
//                .freeStyleCropEnabled(true)// 裁剪框是否可拖拽 true or false
//                .circleDimmedLayer(false)// 是否圆形裁剪 true or false
//                .showCropFrame(true)// 是否显示裁剪矩形边框 圆形裁剪时建议设为false   true or false
//                .showCropGrid(true)// 是否显示裁剪矩形网格 圆形裁剪时建议设为false    true or false
//                .openClickSound(false)// 是否开启点击声音 true or false
                .selectionMedia(selList)// 是否传入已选图片 List<LocalMedia> list
//                .previewEggs(true)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) true or false
//                .cropCompressQuality(80)// 裁剪压缩质量 默认90 int
//                .minimumCompressSize(100)// 小于100kb的图片不压缩
//                .synOrAsy(true)//同步true或异步false 压缩 默认同步
//                        .cropWH()// 裁剪宽高比，设置如果大于图片本身宽高则无效 int
//                .rotateEnabled(false) // 裁剪是否可旋转图片 true or false
//                .scaleEnabled(false)// 裁剪是否可放大缩小图片 true or false
//                        .videoQuality()// 视频录制质量 0 or 1 int
//                        .videoMaxSecond(15)// 显示多少秒以内的视频or音频也可适用 int
//                        .videoMinSecond(10)// 显示多少秒以内的视频or音频也可适用 int
//                        .recordVideoSecond()//视频秒数录制 默认60s int
//                .isDragFrame(true)// 是否可拖动裁剪框(固定)
                .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
    }



    public static void picturePreview(Activity activity , int position , List<LocalMedia> selectList){

        PictureSelector.create(activity)
                .themeStyle(R.style.picture_default_style)
                .openExternalPreview(position , selectList);
    }

    public static void picturePreviewWithUrl(Activity activity , int position , List<String> selectList){

        List<LocalMedia> localMediaList = new ArrayList<>();
        for (String str : selectList){
            LocalMedia localMedia = new LocalMedia();
            localMedia.setPath(str);
            localMediaList.add(localMedia);

        }

        picturePreview(activity , position , localMediaList);
    }

    ////////////////////////////////////////文件上传///////////////////////////////////////////////

    /**图片上传
     *
     * @param filePath
     * @param imgUpLoadListener
     */
    public static void upLoadSingleImg(String filePath, final ImgUpLoadListener imgUpLoadListener) {

        Observable.just(filePath)
                .subscribeOn(Schedulers.io())
                .map(new Func1<String, String>() {

                    @Override
                    public String call(String s) {
                        return uploadingAli(s,imgUpLoadListener);
                    }
                }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                imgUpLoadListener.OnError("上传失败，请稍后重试");
            }

            @Override
            public void onNext(String s) {
                imgUpLoadListener.OnSuccess(s);
            }
        });

    }

    private static String uploadingAli(String fileName,ImgUpLoadListener imgUpLoadListener) {
        String uuid = Constant.getUUIDImageUrl(Constant.getPicNameFromPath(fileName));
        PutObjectRequest put = new PutObjectRequest(App.TESTBUCKET, uuid, fileName);
        try {
            PutObjectResult putResult = App.oss.putObject(put);
            if (putResult.getStatusCode() == 200) {//成功
                return Constant.ALIYUNURL + uuid;
            } else {
                return null;
            }
        } catch (final ClientException e) {
            imgUpLoadListener.OnError("网络异常，请稍后重试");
            return null;
        } catch (ServiceException e) {//服务器异常
            imgUpLoadListener.OnError("服务端数据异常，请稍后重试");
            return null;
        }
    }


    private static List<String> successFileList;

    public static void upLoadImgs(final List<String> wrongFileList, final ImgUpLoadListener imgUpLoadListener) {
        if(successFileList==null){
            successFileList = new ArrayList<>();
        }else{
            successFileList.clear();
        }
        Observable.just(wrongFileList)
                .subscribeOn(Schedulers.io())
                .map(new Func1<List<String>, List<String>>() {
                    @Override
                    public List<String> call(List<String> wrongFileList) {
                        for (String fileBean : wrongFileList) {
                            successFileList.add(uploadingAli(fileBean,imgUpLoadListener));
                        }
                        return successFileList;
                    }
                }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<List<String>>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                imgUpLoadListener.OnError("上传失败,请稍后重试");
            }

            @Override
            public void onNext(List<String> successFileList) {
                if(successFileList!=null && successFileList.size()>0){
                    if(wrongFileList.size()==successFileList.size()){
                        imgUpLoadListener.OnListUpSuccess(successFileList);
                    } else{
                        imgUpLoadListener.OnError("上传失败,请稍后重试");
                    }
                }else{
                    imgUpLoadListener.OnError("上传失败,请稍后重试");
                }
            }
        });

    }

    /**
     * Created by qyqx on 2018/6/13.
     * 照片上传监听
     */

    public interface ImgUpLoadListener {

        void OnSuccess(String successUrl);//单张上传

        void OnError(String message);

        void OnListUpSuccess(List<String> successFileList);//多张上传
    }
}
